package RMI.server.implement;

import RMI.server.interfaces.Comunication;
import RMI.server.util.Log;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Date;
import java.util.List;
import javax.swing.JOptionPane;
import sisvenda.clientes.ClienteBean;
import sisvenda.clientes.ClienteControl;
import sisvenda.fornecedores.FornecedorBean;
import sisvenda.fornecedores.FornecedorControl;
import sisvenda.produtos.ProdutoBean;
import sisvenda.produtos.ProdutoControl;
import sisvenda.vendas.VendasBean;
import sisvenda.vendas.VendasControl;



public class Server implements Comunication{

	public Server() {
		int port = 1099;
		try {       
			 	Log.info("Inicializando o server....");
                           JOptionPane.showMessageDialog(null,"Inicializando o server....");
	            Registry registry = LocateRegistry.createRegistry(port);    
	            Comunication stub = (Comunication) UnicastRemoteObject.exportObject(this, port);
	            Thread.sleep(2000); //Espera que o RMI Registry carregue.            
		        registry.rebind("clienteCalculadora", stub);
		        Log.info("Server foi iniciado no port: " + port);

                     JOptionPane.showMessageDialog(null,port);
		} catch (RemoteException ex) {
			 Log.fatal(ex.getMessage(), ex);
		} catch (InterruptedException ex) {
			Log.error(ex.getMessage(), ex);
	    }
	}
	
	@Override
	public synchronized String soma(int vlr1, int vlr2)throws RemoteException {
		Log.info("Calculando: "+vlr1+" + "+vlr2);
		return ""+(vlr1+vlr2);
	}
	public synchronized void alterarCliente(ClienteBean cliente)throws RemoteException {
		ClienteControl c_Control = new ClienteControl();
		c_Control.alterarCliente(cliente);
	}
	
	
	public synchronized void cadastrarCliente(ClienteBean cliente)throws RemoteException {
		ClienteControl c_Control = new ClienteControl();
		c_Control.cadastrarCliente(cliente);
	}
	
	public synchronized List<ClienteBean> listarClientes(String nome)throws RemoteException {
		ClienteControl c_Control = new ClienteControl();
		return c_Control.listarClientes(nome);	
	}
	public synchronized void alterarFornecedor(FornecedorBean fornecedor)throws RemoteException {
		FornecedorControl c_Control = new FornecedorControl();
		c_Control.alterarFornecedor(fornecedor);
	}
	
	
	public synchronized void cadastrarFornecedor(FornecedorBean fornecedor)throws RemoteException {
		FornecedorControl c_Control = new FornecedorControl();
		c_Control.cadastrarFornecedor(fornecedor);
	}
	
	public synchronized List<FornecedorBean> listarFornecedors(String nome)throws RemoteException {
		FornecedorControl c_Control = new FornecedorControl();
		return c_Control.listarFornecedores(nome);	
	}
	public synchronized void alterarProduto(ProdutoBean produto)throws RemoteException {
		ProdutoControl c_Control = new ProdutoControl();
		c_Control.alterarProduto(produto);
	}
	
	public synchronized void cadastrarProduto(ProdutoBean produto)throws RemoteException {
		ProdutoControl c_Control = new ProdutoControl();
		c_Control.cadastrarProduto(produto);
	}
	 
	public List<ProdutoBean> listarProdutos(String nome){
		ProdutoControl c_Control = new ProdutoControl();		
		return c_Control.listarProdutos(nome);
	}
	
	  public synchronized int buscarCodigoUltimaVenda()throws RemoteException {
			VendasControl c_Control = new VendasControl();
			return c_Control.buscarCodigoUltimaVenda();
		    }
		    
		    public synchronized void cadastrarVenda(VendasBean venda)throws RemoteException {
			VendasControl c_Control = new VendasControl();
			 c_Control.cadastrarVenda(venda);
		    }
			
			public synchronized  List<VendasBean> listarVendas(Date dataInicial, Date dataFinal)throws RemoteException {
			VendasControl c_Control = new VendasControl();
		        return c_Control.listarVendas(dataInicial, dataFinal);
		    }
			
			public static void main(String[] args) {
		new Server();
	}


	
}
